package com.yc.designMode;

/**
 * 单例模式
 * @author yc
 *
 */
public class Singleton {
	
	private Singleton() {}
	
	private static Singleton instance = new Singleton();
	
	public static Singleton getInstance() {
		return instance;
	}

}

/**
 * 据说是一种改进
 * 无非就是用的时候才会第一次创建，号称可以提高性能
 * 既然写了，这东西还会不用？既然都搞成单例了 说明这东西就是用的人太多，怎么可能没人用。如果基本没人用，就不需要写什么单例了
 * 这么多人用，每次还判断一下 岂不多余，个人感觉这种方式反而是降低性能
 * @author yc
 *
 */
class Singleton1 {
	private Singleton1() {};
	
	private static Singleton1 instance = null;
	
	public static synchronized Singleton1 getInstance() {
		if (instance == null) {
			instance = new Singleton1();
		}
		return instance;
	}
}

/**
 * 被广泛认同都经典写法
 * double-check
 * 个人觉得这种写法也就是对Singleton1对稍微优化
 * 优化的点出现对概率非常低，因为如果概率很高，那么绝对还是Singleton性能最好
 * @author yc
 *
 */
class Singleton2 {
	private Singleton2() {};
	
	private static Singleton2 instance = null;
	
	public static Singleton2 getInstance() {
		if (null == instance) {
			synchronized (Singleton2.class) {
				if (null == instance) {
					instance = new Singleton2();
				}
			}
		}
		return instance;
	}
	
}

/**
 * 这算是对Singleton对优化
 * 怎么说呢，增加对成本是又搞了一个内部类，每次获取都会从内部类里获取
 * 如果真的被访问都很频繁，我不清楚这种成本是否可以忽略
 * @author yc
 *
 */
class Singleton3 {
	private Singleton3() {};
	private static class Singleton3Instance {
		private static final Singleton3 instance = new Singleton3();
	}
	public static Singleton3 getInstance() {
		return Singleton3Instance.instance;
	}
}

/**
 * 总结：
 * 如果知道被访问都很频繁，那么我会用最简单Singleton：简单/高效【简单 和 高效都达到满分】
 * 如果知道被访问都比较少，那么Singleton1就可以，有时间心思都话，写成Singleton2也很好
 * 如果不知道访问频率都话，Singleton2 和 Singleton3都可以
 */

